-- UserProtocolM
-- Created by chengb Oct/18/2016
-- 负责用户协议相关逻辑

module("UserProtocolM", package.seeall);

-- 用户协议状态
local STATE_NOT_AGREE              = 0;    -- 未同意
local STATE_AGREE_WITHOUT_REPORT   = 1;    -- 同意，但是未上报服务器
local STATE_AGREE_WITH_REPORT      = 2;    -- 同意，并且已上报服务器

-- 每个部分可显示的段落数量
local PART_PARAGRAPH_NUM = 15;  -- TODO

-- 内部函数声明
local whenLoginOk;

-- 初始化
function init()
    if not isFunctionOpen() then
        -- 功能未开放，不执行初始化
        return;
    end

    -- 关注玩家登录的回调
    EventMgr.removeAll("UserProtocolM");

    -- 关注玩家登录的回调
    EventMgr.register("UserProtocolM", event.LOGIN_OK, whenLoginOk);
end

-- 用户协议功能是否开放
function isFunctionOpen()
    -- 目前只有雷霆平台开放用户协议
    if PUBLISH_PLATFORM ~= PUBLISH_TYPE_LT then
        return false;
    end
    return true;
end

-- 获取用户协议内容
function getUserProtocolInfo()
    local path = string.format("res/user_protocol/%s/user_protocol.txt", PUBLISH_PLATFORM);

    -- 通过getStringFromFile接口读取的字符串包含"\r"，需要过滤掉
    local data = cc.FileUtils:getInstance():getStringFromFile(path);
    if data == "" then
        trace("UserProtocolM", "获取用户协议内容失败了！");
        return { ["title"] = "", ["content"] = { "" }, };
    end

    data = string.gsub(data, "\r", "")

    -- 解析出标题和正文
    -- 第一行为标题，第二行开始为正文
    local index   = string.find(data, "\n");
    local title   = string.sub(data, 1, index - 1);
    local content = string.sub(data, index + 1, -1);
    local partList = explodeContent(content);
    return { ["title"] = title, ["content"] = partList }
end

-- 将内容成几个部分
function explodeContent(content)
    local arr = string.explode(content, "\n");
    local partList = {};
    local partContent = "";
    for i = 1, #arr do
        partContent = partContent .. arr[i] .. "\n";
        if i % PART_PARAGRAPH_NUM == 0 or i == #arr then
            table.insert(partList, partContent);
            partContent = "";
        end
    end
    return partList;
end

-- 是否需要阅读用户协议
function needReadUserProtocol()
    if not isFunctionOpen() then
        -- 功能未开放
        return false;
    end

    if hasAgreedUserProtocol() then
        -- 已经统一过用户协议了
        return false;
    end

    return true;
end

-- 是否同意过用户协议
function hasAgreedUserProtocol()
    return getUserProtocolState() ~= STATE_NOT_AGREE;
end

-- 获取用户协议的状态
function getUserProtocolState()
    return tonumber(UserDefaultM.getStringForKey("user_protocol_state"));
end

-- 获取同意用户协议的时间
function getAgreeTime()
    if not hasAgreedUserProtocol() then
        -- 还没同意
        return nil;
    end

    local agreeTime = UserDefaultM.getStringForKey("user_protocol_argee_time");
    if agreeTime == "" then
        return TimeM.getCurrentTime();
    else
        return tonumber(agreeTime);
    end
end

-- 同意用户协议
function agreeUserProtocol()
    if hasAgreedUserProtocol() then
        -- 已经同意过了
        return false;
    end

    -- 记录点击同意的时间
    local curTime = TimeM.getCurrentTime();
    UserDefaultM.setStringForKey("user_protocol_argee_time", tostring(math.ceil(curTime)));

    changeState(STATE_AGREE_WITHOUT_REPORT);

    return true;
end

-- 改变协议状态
function changeState(state)
    assert(type(state) == "number");

    trace("UserProtocolM", "用户协议状态变更为：%d", state);
    UserDefaultM.setStringForKey("user_protocol_state", tostring(state));
end

-- 玩家登录成功的回调
function whenLoginOk()
    local state = getUserProtocolState();
    if state == STATE_AGREE_WITHOUT_REPORT then
        -- 如果已经同意了协议，但是未上报，则需要上报服务器
        changeState(STATE_AGREE_WITH_REPORT);
        local agreeTime = getAgreeTime();
        Operation.cmd_agree_user_protocol(agreeTime);
    end
end

